package com.ftg.learn.back.pattern.singleton;

/**
 * 单例设计 - 双重锁 double-checked locking  dcl
 *  2019 美团 解释 DCl
 * @author kangjx
 * @createTime 2022/9/1
 */
public class LearnSingleton3 {


    //禁止指令重排
    //线程可见性
    private volatile static LearnSingleton3 instance = null;

    /**
     * 私有化构造方法以后，我们不能放其它调用了
     * 堆 里面开廦三个地址
     */
    private LearnSingleton3(){  }

    /**
     * 一共公共，不能是实例方法
     * 只能是类方法 .
     * 其次： 关闭了构造方法 ,开放一个公共的方法 用来完成构造方法 调用
     * synchronized添加 互斥锁 优点 线程安全  缺点 性能较差
     */
    public static LearnSingleton3 getSingletonInstance(){
        //虽然我们把创建逻辑封装起来了  new
        if(null == instance){
            synchronized(LearnSingleton3.class){
                if(null == instance){
                    instance = new LearnSingleton3();
                }
            }
        }
        return instance;
    }

}
